package net.hn.hnms.biz.support.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 支架阻力测点实时信息(DwdZdsbNowSupport)实体类
 *
 * @author makejava
 * @since 2022-09-07 10:37:55
 */
@Data
@TableName("dwd_zdsb_now_support")
public class SupportNowPo implements Serializable,Comparable<SupportNowPo> {
    private static final long serialVersionUID = 801659549077847900L;
    /**
     * 煤矿编码
     */
    @ApiModelProperty(value = "煤矿编码")
    private String mineCode;
    /**
     * 数据时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @ApiModelProperty(value = "数据时间")
    private Date dataTime;
    /**
     * 测点编码
     */
    @ApiModelProperty(value = "测点编码")
    private String pointCode;
    /**
     * 传感器类型
     */
    @ApiModelProperty(value = "传感器类型")
    private String sensorType;
    /**
     * 传感器编号
     */
    @ApiModelProperty(value = "传感器编号")
    private String sensorNo;
    /**
     * 传感器位置
     */
    @ApiModelProperty(value = "传感器位置")
    private String pointLocation;
    /**
     * 测点数值
     */
    @ApiModelProperty(value = "测点数值")
    private BigDecimal pointValue;
    /**
     * 测点状态（0是bad，1是good）
     */
    @ApiModelProperty(value = "测点状态（0是bad，1是good）")
    private Integer pointStatus;

    /**
     * 数字字符串转数字数组
     * 适配 1.25.3.5 这种情况 ，同时如果不不包含小数点【整数情况】
     *
     * @return
     */
    public  String[] numberStrToNumberArray(String numberStr) {
        // 按小数点分割字符串数组
        String[] numberArray = numberStr.split("\\.");
        // 长度为0说明没有小数点，则整个字符串作为第一个元素
        if (numberArray.length == 0) {
            numberArray = new String[]{numberStr};
        }
        return numberArray;

    }
    /**
     * 比较两个数字数组
     *
     * @param numberArray1
     * @param numberArray2
     * @return
     */
    public int compareNumberArray(String[] numberArray1, String[] numberArray2) {
        for (int i = 0; i < numberArray1.length; i++) {
            if (numberArray2.length < i + 1) { // 此时数字数组2比1短，直接返回
                return 1;
            }
            int compareResult = Integer.valueOf(numberArray1[i]).compareTo(Integer.valueOf(numberArray2[i]));
            if (compareResult != 0) {
                return compareResult;
            }
        }
        // 说明数组1比数组2短，返回小于
        return -1;
    }

    //    数字+中文 按照数字排序
    @Override
    public int compareTo(@NotNull SupportNowPo o) {
        String str1 = this.pointLocation;
        String str2 = o.getPointLocation();
        // 处理数据为null的情况
        if (str1 == null && str2 == null) {
            return 0;
        }
        if (str1 == null) {
            return -1;
        }
        if (str2 == null) {
            return 1;
        }
        if (str1.equals(str2)) {
            return 0;
        }
        // 比较字符串中的每个字符
        char c1;
        char c2;
        // 逐字比较返回结果
        for (int i = 0; i < str1.length(); i++) {
            c1 = str1.charAt(i);
            try {
                c2 = str2.charAt(i);
            } catch (StringIndexOutOfBoundsException e) { // 如果在该字符前，两个串都一样，str2更短，则str1较大
                return 1;
            }
            // 如果都是数字的话，则需要考虑多位数的情况，取出完整的数字字符串，转化为数字再进行比较
            if (Character.isDigit(c1) && Character.isDigit(c2)) {
                String numStr1 = "";
                String numStr2 = "";
                // 获取数字部分字符串
                for (int j = i; j < str1.length(); j++) {
                    c1 = str1.charAt(j);
                    if (!Character.isDigit(c1) && c1 != '.') { // 不是数字则直接退出循环
                        break;
                    }
                    numStr1 += c1;
                }
                for (int j = i; j < str2.length(); j++) {
                    c2 = str2.charAt(j);
                    if (!Character.isDigit(c2) && c2 != '.') { // 考虑可能带小数的情况
                        break;
                    }
                    numStr2 += c2;
                }
                // 转换成数字数组进行比较 适配 1.25.3.5 这种情况
                String[] numberArray1 = numberStrToNumberArray(numStr1);
                String[] numberArray2 = numberStrToNumberArray(numStr2);
                return compareNumberArray(numberArray1, numberArray2);
            }

            // 不是数字的比较方式
            if (c1 != c2) {
                return c1 - c2;
            }
        }
        return 0;
    }
}

